package main

import (
	"fmt"
	"net"
)

//讲解InterfaceAddrs,Interfaces,JoinHostPort,LookupAddr,LookupCNAME,LookupHost,LookupIP函数的使用
func main() {
	//net.InterfaceAddrs 的使用示例
	//InterfaceAddrs返回该系统的网络接口的地址列表
	//本地地址,ipv4和ipv6地址,这些信息可通过ifconfig命令看到
	fmt.Printf("\nExample : ---> Use of net.InterfaceAddrs <--- \n")
	addr, _ := net.InterfaceAddrs()
	fmt.Println(addr) //[127.0.0.1/8 10.236.15.24/24 ::1/128 fe80::3617:ebff:febe:f123/64]

	fmt.Println("len:", len(addr))
	for k, v := range addr {
		fmt.Println("index:", k, "value:", v)
	}

	//net.Interfaces 的使用示例
	//Interfaces返回该系统的网络接口列表
	fmt.Printf("\nExample : ---> Use of net.Interfaces <---\n")
	interfaces, _ := net.Interfaces()
	fmt.Println("len(interfaces):", len(interfaces))

	//fmt.Println(interfaces) //[{1 65536 lo  up|loopback} {2 1500 eth0 34:17:eb:be:f1:23 up|broadcast|multicast}] 类型:MTU(最大传输单元),网络接口名,支持状态
	for i := 0; i < len(interfaces); i++ {
		//fmt.Println("index :",i,"value: ",interfaces[i])
		addr, _ := interfaces[i].Addrs()
		fmt.Printf("index:%d name:%v addr:%v\n", i, interfaces[i].Name, addr)
	}

	//net.JoinHostPort 的使用示例
	//JoinHostPort将host和port合并为一个网络地址。一般格式为"host:port"；如果host含有冒号或百分号，格式为"[host]:port"
	fmt.Printf("\nExample : ---> Use of net.JoinHostPort <--- \n")
	hp := net.JoinHostPort("127.0.0.1", "8080")
	fmt.Println("hp:", hp) //127.0.0.1:8080,根据ip和端口组成一个addr字符串表示
	hp = net.JoinHostPort("127:.0.%0.1", "8080")
	fmt.Println("hp:", hp) //127.0.0.1:8080,根据ip和端口组成一个addr字符串表示

	//net.LookupAddr 的使用示例
	//LookupAddr 对于给定的地址进行反向查找，并返回映射到那个地址的一个list列表
	fmt.Printf("\nExample : ---> Use of net.LookupAddr <--- \n")
	lt, _ := net.LookupAddr("127.0.0.1")
	fmt.Println(lt) //[localhost],根据地址查找到改地址的一个映射列表,可以修改"C:\\Windows\\System32\\drivers\\etc\\host" ,增加一行127.0.0.1 localhost查看效果
	fmt.Println(len(lt))
	for i := 0; i < len(lt); i++ {
		println("index:", i, "addr:", lt[i])
	}

	//net.LookupCNAME 使用示例
	//LookupCNAME 返回给定名字的规范的DNS主机名称，如果调用者不关心这个name是否规范，可以直接调用LookupHost 或者 LookupIP，这两个函数都会在查询时考虑到name的规范性
	fmt.Printf("\nExample : ---> Use of net.LookupCNAME <--- \n")
	cname, _ := net.LookupCNAME("www.baidu.com")
	fmt.Println("len(cname):", len(cname))
	fmt.Println(cname) //www.a.shifen.com,查找规范的dns主机名字

	fmt.Println("cname:", cname)

	//net.LookupHost 使用示例
	//LookupHost 通过利用本地解析器对给定的host进行查找，返回主机地址的数组
	fmt.Printf("\nExample : ---> Use of net.LookupHost <--- \n")
	host, _ := net.LookupHost("www.baidu.com")
	fmt.Println("len(host):", len(host))

	for k, v := range host {
		fmt.Printf("index:%d,value:%s\n", k, v)
	}

	//net.LookupIP 使用示例
	//LookupIP通过利用本地解析器查找host，返回主机ipv4和ipv6地址的一个数组
	//LookupHost 和命令行nslookup 返回的结果是一致的.
	fmt.Printf("\nExample : ---> Use of net.LookupIP <--- \n")
	ip, _ := net.LookupIP("www.baidu.com")
	fmt.Println("len(host):", len(ip))

	for k, v := range ip {
		fmt.Printf("index:%d,value:%s\n", k, v)
	}
}
